"""
腾讯云COS相关API视图 - 像素项目
"""
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from django.contrib.auth.decorators import login_required
from .cos_utils import cos_uploader
from users.models import UserProfile


@csrf_exempt
@require_http_methods(["POST"])
@login_required
def upload_avatar(request):
    """
    用户头像上传接口
    
    权限: 已登录用户
    
    参数:
        - avatar: 头像文件（支持JPEG、PNG、GIF、WebP格式，最大5MB）
    
    返回:
        - success: 是否成功
        - message: 提示信息
        - data: {
            - avatar_url: 头像访问URL
            - avatar_path: 头像在COS中的路径
        }
    """
    try:
        if 'avatar' not in request.FILES:
            return JsonResponse({
                'success': False,
                'message': '请选择要上传的头像文件'
            }, status=400)
        
        avatar_file = request.FILES['avatar']
        
        # 验证文件类型和大小
        allowed_types = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']
        max_size = 5 * 1024 * 1024  # 5MB
        
        if avatar_file.content_type not in allowed_types:
            return JsonResponse({
                'success': False,
                'message': '只支持JPEG、PNG、GIF、WebP格式的图片'
            }, status=400)
        
        if avatar_file.size > max_size:
            return JsonResponse({
                'success': False,
                'message': '头像文件大小不能超过5MB'
            }, status=400)
        
        # 获取要上传的用户ID（支持管理员为其他用户上传）
        target_user_id = request.GET.get('user_id') or request.user.id
        
        # 如果是管理员且指定了其他用户ID，则允许上传
        if str(target_user_id) != str(request.user.id) and not request.user.is_staff:
            return JsonResponse({
                'success': False,
                'message': '无权为其他用户上传头像'
            }, status=403)
        
        # 上传到腾讯云COS
        upload_result = cos_uploader.upload_file(
            avatar_file, 
            file_type='avatar', 
            user_id=target_user_id
        )
        
        if not upload_result['success']:
            return JsonResponse({
                'success': False,
                'message': upload_result['message']
            }, status=500)
        
        # 更新用户头像信息到数据库
        try:
            # 如果是为其他用户上传，获取目标用户
            if str(target_user_id) != str(request.user.id):
                from django.contrib.auth.models import User
                target_user = User.objects.get(id=target_user_id)
                profile = target_user.profile
            else:
                profile = request.user.profile
            
            # 如果有旧头像，先删除
            if profile.avatar:
                # 这里可以添加删除旧头像的逻辑
                pass
            
            # 更新头像URL
            profile.avatar = upload_result['url']
            profile.save()
            
            return JsonResponse({
                'success': True,
                'message': '头像上传成功',
                'data': {
                    'avatar_url': upload_result['url'],
                    'avatar_path': upload_result['path']
                }
            })
            
        except UserProfile.DoesNotExist:
            # 如果用户扩展信息不存在，创建默认的
            profile = UserProfile.objects.create(
                user=request.user,
                avatar=upload_result['url']
            )
            
            return JsonResponse({
                'success': True,
                'message': '头像上传成功',
                'data': {
                    'avatar_url': upload_result['url'],
                    'avatar_path': upload_result['path']
                }
            })
            
    except Exception as e:
        return JsonResponse({
            'success': False,
            'message': f'头像上传失败: {str(e)}'
        }, status=500)


@csrf_exempt
@require_http_methods(["DELETE"])
@login_required
def delete_avatar(request):
    """
    删除用户头像接口
    
    权限: 已登录用户
    
    返回:
        - success: 是否成功
        - message: 提示信息
    """
    try:
        profile = request.user.profile
        
        if not profile.avatar:
            return JsonResponse({
                'success': False,
                'message': '当前没有头像可删除'
            }, status=400)
        
        # 从COS头像URL中提取文件路径
        avatar_url = profile.avatar
        cos_domain = settings.TENCENT_COS_CONFIG['DOMAIN'] + '/'
        
        if avatar_url.startswith(cos_domain):
            # 提取文件路径（去掉域名部分）
            file_path = avatar_url.replace(cos_domain, '')
            
            # 删除COS中的实际文件
            delete_result = cos_uploader.delete_file(file_path)
            
            if not delete_result['success']:
                # 如果删除失败，记录日志但仍继续清理数据库
                print(f"COS文件删除失败: {delete_result['message']}")
        
        # 从数据库中清除头像信息
        old_avatar = profile.avatar
        profile.avatar = None
        profile.save()
        
        # 记录删除操作（可选）
        print(f"用户 {request.user.username} 头像已删除，原头像URL: {old_avatar}")
        
        return JsonResponse({
            'success': True,
            'message': '头像删除成功',
            'data': {
                'deleted_avatar_url': old_avatar
            }
        })
        
    except UserProfile.DoesNotExist:
        return JsonResponse({
            'success': False,
            'message': '用户信息不存在'
        }, status=404)
    except Exception as e:
        return JsonResponse({
            'success': False,
            'message': f'头像删除失败: {str(e)}'
        }, status=500)


@csrf_exempt
@require_http_methods(["POST"])
@login_required
def upload_image(request):
    """
    通用图片上传接口（用于其他功能模块）
    
    权限: 已登录用户
    
    参数:
        - image: 图片文件
        - file_type: 文件类型（如：carbon, community, exchange等）
    
    返回:
        - success: 是否成功
        - message: 提示信息
        - data: {
            - image_url: 图片访问URL
            - image_path: 图片在COS中的路径
        }
    """
    try:
        if 'image' not in request.FILES:
            return JsonResponse({
                'success': False,
                'message': '请选择要上传的图片文件'
            }, status=400)
        
        image_file = request.FILES['image']
        file_type = request.POST.get('file_type', 'image')
        
        # 验证文件类型和大小
        allowed_types = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']
        max_size = 10 * 1024 * 1024  # 10MB
        
        if image_file.content_type not in allowed_types:
            return JsonResponse({
                'success': False,
                'message': '只支持JPEG、PNG、GIF、WebP格式的图片'
            }, status=400)
        
        if image_file.size > max_size:
            return JsonResponse({
                'success': False,
                'message': '图片文件大小不能超过10MB'
            }, status=400)
        
        # 上传到腾讯云COS
        upload_result = cos_uploader.upload_file(
            image_file, 
            file_type=file_type, 
            user_id=request.user.id
        )
        
        if not upload_result['success']:
            return JsonResponse({
                'success': False,
                'message': upload_result['message']
            }, status=500)
        
        return JsonResponse({
            'success': True,
            'message': '图片上传成功',
            'data': {
                'image_url': upload_result['url'],
                'image_path': upload_result['path']
            }
        })
        
    except Exception as e:
        return JsonResponse({
            'success': False,
            'message': f'图片上传失败: {str(e)}'
        }, status=500)